package exercises.leetcode;

/**
 * <a href="https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/">
 * 405. 数字转换为十六进制数</a>
 *
 * <p><span color="#87CEEB">描述:</span>
 * 给定一个整数，编写一个算法将这个数转换为十六进制数。对于负整数，我们通常使用 补码运算 方法。
 * <p>
 * 注意:
 * <ol>
 * <li>十六进制中所有字母(a-f)都必须是小写。</li>
 * <li>十六进制字符串中不能包含多余的前导零。如果要转化的数为0，那么以单个字符'0'来表示；对于其他情况，十六进制字符串中的第一个字符将不会是0字符。 </li>
 * <li>给定的数确保在32位有符号整数范围内。</li>
 * <li>不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。</li>
 * </ol>
 * 示例 1：
 * <p>
 * 输入:
 * 26
 * <p>
 * 输出:
 * "1a"
 * <p>
 * 示例 2：
 * <p>
 * 输入:
 * -1
 * <p>
 * 输出:
 * "ffffffff"
 *
 * @author or2
 * @date 2021年10月02日 时间: 11:11
 */
public class No405 {
    public String toHex(int num) {
        if (num == 0)
            return "0";
        StringBuilder resBuilder = new StringBuilder();
        while (num != 0) {
            int value = num & 15;
            if (value < 10)
                resBuilder.append(value);
            else
                resBuilder.append((char) (value - 10 + 'a'));
            num >>>= 4;
        }

        return resBuilder.reverse().toString();
    }


    public String toHexOptimize(int num) {
        if (num == 0)
            return "0";
        int size = 0, temp = num;
        if (temp < 0)
            size = 8;
        else
            while (temp > 0) {
                size++;
                temp >>>= 4;
            }
        char[] res = new char[size];
        for (int i = size - 1; i >= 0; i--) {
            temp = num & 15;
            if (temp < 10)
                res[i] = (char) (temp + '0');
            else
                res[i] = (char) (temp - 10 + 'a');
            num >>>= 4;
        }

        return new String(res);
    }
}
